// 计算距离
function getDistance(lat1: number, lng1: number, lat2: number, lng2: number) {
  const R = 6371; // 地球半径，单位：千米
  const dLat = deg2rad(lat2 - lat1);
  const dLon = deg2rad(lng2 - lng1);
  const a =
    Math.sin(dLat / 2) * Math.sin(dLat / 2) +
    Math.cos(deg2rad(lat1)) *
      Math.cos(deg2rad(lat2)) *
      Math.sin(dLon / 2) *
      Math.sin(dLon / 2);
  const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  const distance = R * c; // 距离，单位：千米
  return distance;
}

function deg2rad(deg: any) {
  return deg * (Math.PI / 180);
}

// 百度转腾讯或高德
/**
 *
 * @param lng 百度经度
 * @param lat 百度纬度
 * @returns {longitude:腾讯或高德经度,latitude:腾讯或高德纬度}
 */
function BaiduMapTransTxMap(lng: number, lat: number) {
  let x_pi = (3.14159265358979324 * 3000.0) / 180.0;
  let x = lng - 0.0065;
  let y = lat - 0.006;
  let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
  let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
  let longitude = z * Math.cos(theta);
  let latitude = z * Math.sin(theta);
  return {
    longitude,
    latitude,
  };
}
// 计算距离
/**
 *
 * @param lat1   纬度1
 * @param lng1   经度1
 * @param lat2   纬度2
 * @param lng2   经度2
 * @returns 距离
 */
function distance(lat1: number, lng1: number, lat2: number, lng2: number) {
  let { longitude, latitude } = BaiduMapTransTxMap(lng1, lat1);
  let distanceN = getDistance(latitude, longitude, lat2, lng2);
  let distanceStr = "";
  if (distanceN < 1) {
    distanceStr = (distanceN * 1000).toFixed(0) + "米";
  } else {
    distanceStr = distanceN.toFixed(2) + "公里";
  }
  return distanceStr;
}

/**
 * 坐标转换，腾讯地图转换成百度地图坐标
 * @param lng 腾讯经度
 * @param lat 腾讯纬度
 * @returns {longitude:百度经度,latitude:百度纬度}
 */
function qqMapToBMap(lng: string, lat: string) {
  const x_pi = 3.14159265358979324;
  let x = parseFloat(lng);
  let y = parseFloat(lat);
  let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
  let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
  let longitude = (z * Math.cos(theta) + 0.0065).toFixed(10);
  let latitude = (z * Math.sin(theta) + 0.006).toFixed(10);
  return { longitude, latitude };
}

export default { getDistance, BaiduMapTransTxMap, distance, qqMapToBMap };
